/**
 * 短视频增删改查相关接口
 * @Author: thoomi
 */

package controllers

import (
	"fmt"
	"github.com/goravel/framework/contracts/http"
	"github.com/goravel/framework/facades"
	json2 "github.com/goravel/framework/support/json"
	"github.com/jinzhu/copier"
	"goravel/app/models"
	"goravel/app/services"
	"goravel/app/types"
	"gorm.io/datatypes"
)

type ShortVideoController struct {
	DbServer services.DBServer
}

func NewShortVideoController() *ShortVideoController {
	return &ShortVideoController{
		DbServer: services.NewDBService(),
	}
}

// Index 短视频列表
// @Summary      短视频列表
// @Tags         ShortVideo
// @Router       /short_video [get]
func (c *ShortVideoController) Index(ctx http.Context) http.Response {
	var shortVideos []models.ShortVideo
	var shortVideosReq []types.ShortVideoListReq
	query := facades.Orm().Query().OrderBy("id", "desc")
	data, meta, err := c.DbServer.ListPage(ctx, &shortVideos, query, &shortVideosReq)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).DataPage(data, meta)
}

// Show 短视频详情
// @Summary      短视频详情
// @Tags         ShortVideo
// @Router       /short_video [get]
func (c *ShortVideoController) Show(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	var dao models.ShortVideo
	err := facades.Orm().Query().FindOrFail(&dao, id)
	if err != nil {
		return services.NewApiService(ctx).Error500("无相关数据")
	}
	var vo types.ShortVideoInfoResp
	err = copier.Copy(&vo, &dao)
	if err != nil {
		return services.NewApiService(ctx).Error500("数据copier错误")
	}
	return services.NewApiService(ctx).Data(&vo)
}

// Store 新增短视频
// @Summary      新增短视频
// @Tags         ShortVideo
// @Router       /short_video [post]
func (c *ShortVideoController) Store(ctx http.Context) http.Response {
	var vo types.ShortVideoCreateReq
	var err error
	err = ctx.Request().Bind(&vo)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	var dao models.ShortVideo
	err = copier.Copy(&dao, &vo)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	fmt.Printf("%#+v\n", vo)
	var tags string
	tags, err = json2.MarshalString(vo.Tags)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数tags错误")
	}
	dao.Tags = datatypes.JSON(tags)
	fmt.Printf("%#+v\n", dao)
	err = facades.Orm().Query().Create(&dao)
	if err != nil {
		return services.NewApiService(ctx).Error500("数据库插入错误")
	}
	//TODO：上传视频文件，文件类型检查
	return services.NewApiService(ctx).OK("stored")
}

// Update 更新短视频
// @Summary      更新短视频
// @Tags         ShortVideo
// @Router       /short_video/{id} [put]
func (c *ShortVideoController) Update(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	var vo types.ShortVideoCreateReq
	var err error
	err = ctx.Request().Bind(&vo)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	var dao models.ShortVideo
	err = facades.Orm().Query().FindOrFail(&dao, id)
	if err != nil {
		return services.NewApiService(ctx).Error500("无相关数据")
	}
	err = copier.CopyWithOption(&dao, &vo, copier.Option{IgnoreEmpty: true})
	if err != nil {
		return services.NewApiService(ctx).Error500("参数copier错误")
	}
	if len(vo.Tags) != 0 {
		var tags string
		tags, err = json2.MarshalString(vo.Tags)
		if err != nil {
			return services.NewApiService(ctx).Error500("参数tags错误")
		}
		dao.Tags = datatypes.JSON(tags)
	}

	err = facades.Orm().Query().Save(&dao)
	if err != nil {
		return services.NewApiService(ctx).Error500("更新错误")
	}
	return services.NewApiService(ctx).OK("updated")
}

// Destroy 删除短视频
// @Summary      删除短视频
// @Tags         ShortVideo
// @Router       /short_video/{id} [delete]
func (c *ShortVideoController) Destroy(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	var dao models.ShortVideo
	err := facades.Orm().Query().FindOrFail(&dao, id)
	if err != nil {
		return services.NewApiService(ctx).Error500("无相关数据")
	}
	_, err = facades.Orm().Query().Delete(&dao)
	if err != nil {
		return services.NewApiService(ctx).Error500("删除失败")
	}
	//TODO:如果有其他关联表,需要删除关联表数据
	return services.NewApiService(ctx).OK("deleted")
}
